package cn.csc.module.pay.dal.mysql.funddetails;

import cn.csc.framework.common.pojo.PageResult;
import cn.csc.framework.mybatis.core.mapper.BaseMapperX;
import cn.csc.framework.mybatis.core.query.LambdaQueryWrapperX;
import cn.csc.module.pay.controller.admin.funddetails.vo.PayFundDetailsCreateReqVO;
import cn.csc.module.pay.controller.admin.funddetails.vo.PayFundDetailsExportReqVO;
import cn.csc.module.pay.controller.admin.funddetails.vo.PayFundDetailsPageReqVO;
import cn.csc.module.pay.dal.dataobject.funddetails.PayFundDetailsDO;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import org.apache.ibatis.annotations.Mapper;

import java.math.BigDecimal;
import java.math.BigInteger;
import java.util.List;

/**
 * 用户资金收支明细 Mapper
 *
 * @author 华南城
 */
@Mapper
public interface PayFundDetailsMapper extends BaseMapperX<PayFundDetailsDO> {

    default PageResult<PayFundDetailsDO> selectPage(PayFundDetailsPageReqVO reqVO) {
        return selectPage(reqVO, new LambdaQueryWrapperX<PayFundDetailsDO>()
                .eqIfPresent(PayFundDetailsDO::getAppUserId, reqVO.getAppUserId())
                .eqIfPresent(PayFundDetailsDO::getMerchantId, reqVO.getMerchantId())
                .eqIfPresent(PayFundDetailsDO::getRefundDivideMoney, reqVO.getRefundDivideMoney())
                .eqIfPresent(PayFundDetailsDO::getDivideMoney, reqVO.getDivideMoney())
                .eqIfPresent(PayFundDetailsDO::getFreezeMoney, reqVO.getFreezeMoney())
                .eqIfPresent(PayFundDetailsDO::getRefundFreezeMoney, reqVO.getRefundFreezeMoney())
                .eqIfPresent(PayFundDetailsDO::getOrderId, reqVO.getOrderId())
                .eqIfPresent(PayFundDetailsDO::getJzbOrderId, reqVO.getJzbOrderId())
                .eqIfPresent(PayFundDetailsDO::getTradeType, reqVO.getTradeType())
                .betweenIfPresent(PayFundDetailsDO::getCreateTime, reqVO.getCreateTime())
                .orderByDesc(PayFundDetailsDO::getId));
    }

    default List<PayFundDetailsDO> selectList(PayFundDetailsExportReqVO reqVO) {
        return selectList(new LambdaQueryWrapperX<PayFundDetailsDO>()
                .eqIfPresent(PayFundDetailsDO::getAppUserId, reqVO.getAppUserId())
                .eqIfPresent(PayFundDetailsDO::getMerchantId, reqVO.getMerchantId())
                .eqIfPresent(PayFundDetailsDO::getRefundDivideMoney, reqVO.getRefundDivideMoney())
                .eqIfPresent(PayFundDetailsDO::getDivideMoney, reqVO.getDivideMoney())
                .eqIfPresent(PayFundDetailsDO::getFreezeMoney, reqVO.getFreezeMoney())
                .eqIfPresent(PayFundDetailsDO::getRefundFreezeMoney, reqVO.getRefundFreezeMoney())
                .eqIfPresent(PayFundDetailsDO::getOrderId, reqVO.getOrderId())
                .eqIfPresent(PayFundDetailsDO::getJzbOrderId, reqVO.getJzbOrderId())
                .eqIfPresent(PayFundDetailsDO::getTradeType, reqVO.getTradeType())
                .betweenIfPresent(PayFundDetailsDO::getCreateTime, reqVO.getCreateTime())
                .orderByDesc(PayFundDetailsDO::getId));
    }

    default PayFundDetailsDO selectDetail(PayFundDetailsCreateReqVO reqVO) {
        return selectOne(new LambdaQueryWrapperX<PayFundDetailsDO>()
                .eqIfPresent(PayFundDetailsDO::getOrderId, reqVO.getOrderId())
                .eqIfPresent(PayFundDetailsDO::getJzbOrderId, reqVO.getJzbOrderId()));

    }

    default PayFundDetailsDO selectDetailByAppUserId(BigInteger orderId, BigInteger jzbOrderId, String appUserId, BigInteger orderItemId) {
        return selectOne(new LambdaQueryWrapperX<PayFundDetailsDO>()
                .eqIfPresent(PayFundDetailsDO::getOrderId, orderId)
                .eqIfPresent(PayFundDetailsDO::getJzbOrderId, jzbOrderId)
                .eq(PayFundDetailsDO::getAppUserId, appUserId)
                .eqIfPresent(PayFundDetailsDO::getOrderItemId, orderItemId)
                );

    }

    default Integer updateDivideMoneyAndTradeType(BigInteger id, BigDecimal divideMoney, Integer tradeType) {
        LambdaUpdateWrapper<PayFundDetailsDO> updateWrapper = new LambdaUpdateWrapper<>();
        updateWrapper.set(PayFundDetailsDO::getDivideMoney, divideMoney);
        updateWrapper.set(PayFundDetailsDO::getTradeType, tradeType);
        updateWrapper.eq(PayFundDetailsDO::getId, id);
        return update(null, updateWrapper);

    }


}
